package com.example.yunbiji0314.controller;

import com.alibaba.excel.EasyExcel;
import com.aliyun.oss.OSSClient;
import com.example.yunbiji0314.config.UserListener;
import com.example.yunbiji0314.pojo.Article;
import com.example.yunbiji0314.service.ArticleService;
import com.example.yunbiji0314.util.Code;
import com.example.yunbiji0314.util.OssUtil;
import com.example.yunbiji0314.util.PageUtil;
import com.example.yunbiji0314.util.Result;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

@RestController
@RequestMapping("/article")
@Api(tags = "文章管理")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @PostMapping("/findByUserId")
    //要想访问这个接口需要有ROLE_ADMIN角色 并且登录
    @Secured("ROLE_AMIN")
    @ApiModelProperty(value = "根据用户id查询文章")
    public Result findByUserId(@RequestBody PageUtil pageUtil) {
        System.out.println(pageUtil);
        PageInfo<Article> byUserId = articleService.findByUserId(pageUtil);
        if(byUserId!=null){
            return new Result(Code.GET_OK, byUserId, "查询成功");
        }else {
            return new Result(Code.GET_ERR, "查询失败");
        }
    }

    @GetMapping("/deleted/{id}")
    @ApiModelProperty(value = "删除文章")
    public Result deleted(@PathVariable Integer id) {
        int i = articleService.deleted(id);
        if(i>0){
            return new Result(Code.DELETE_OK, "删除成功");
        }else {
            return new Result(Code.DELETE_ERR, "删除失败");
        }
    }

    @GetMapping("/chaid/{id}")
    @ApiModelProperty(value = "根据id查询文章")
    public Result findById(@PathVariable Integer id) {
        System.out.println(id);
        Article byId = articleService.findById(id);
        if(byId!=null){
            return new Result(Code.GET_OK, byId, "查询成功");
        }else {
            return new Result(Code.GET_ERR, "查询失败");
        }
    }

    @Autowired
    private OssUtil ossUtil;

    @RequestMapping("/upload")
    @ApiModelProperty(value = "上传图片")
    public Result upload(MultipartFile file) throws IOException {
        //获取客户端上传过来的文件名
        String filename = file.getOriginalFilename();
        System.out.println("旧文件名："+filename);
        //为了防止客户端传递过来的文件名重复 我们使用uuid重命名
        String newname = UUID.randomUUID().toString().substring(24)+"-"+filename;
        System.out.println("新文件名："+newname);
        //我们的后端此时就会收到前端传递过来的文件
        //我们后端程序就可以选择把文件 放在oss-cn-beijing.aliyuncs.com 服务器上的 upload-0219 桶里
        /**
         * 第一个参数 域名 记得域名前面要加https://
         * 第二个参数  ID
         * 第三个参数 密钥
         */
        OSSClient ossClient = new OSSClient(ossUtil.getUrl(), ossUtil.getId(), ossUtil.getMiyou());
        /**
         * xx调用putObject把文件存放到桶里面
         * 第一个参数 桶名
         * 第二个参数 新文件的名字
         * 第三个参数 客户端上传文件的字节流
         */
        ossClient.putObject(ossUtil.getTong(),newname,file.getInputStream());
        /**
         * https://upload-0219.oss-cn-beijing.aliyuncs.com/30846c2f36ab-tu01.png
         */
        //url=https://oss-cn-beijing.aliyuncs.com
        //获取域名
        String url01=ossUtil.getUrl();
        //分割域名
        String[] split = url01.split("//");
        System.out.println(split[0]);
        System.out.println(split[1]);
        String url=split[0]+"//"+ossUtil.getTong()+"."+split[1]+"/"+newname;
        return new Result(Code.UPLOAD_OK,url, "上传成功");
    }

    @PostMapping("/zengarticle")
    //要想访问这个接口需要有ROLE_ADMIN角色 并且登录
    @Secured("ROLE_ADMIN")
    @ApiModelProperty(value = "添加文章")
    public Result zengarticle(@RequestBody Article article) {
        System.out.println(article);
        int i = articleService.zengarticle(article);
        if(i>0){
            return new Result(Code.ADD_OK, "添加成功");
        }else {
            return new Result(Code.ADD_ERR, "添加失败");
        }
    }

    @PostMapping("/gaiarticle")
    @Secured("ROLE_ADMIN")
    @ApiModelProperty(value = "修改文章")
    public Result update(@RequestBody Article article) {
        System.out.println(article);
        int i = articleService.update(article);
        if(i>0){
            return new Result(Code.UPDATE_OK, "修改成功");
        }else {
            return new Result(Code.UPDATE_ERR, "修改失败");
        }
    }

    @Autowired
    private UserListener ul;
    @PostMapping(value = "/importData")
    public Result importData(MultipartFile file){

        try {
            // 获取前端上传文件的字节流  读流
            InputStream inputStream = file.getInputStream();
            // 从这个文件流中读取数据并且把这一行数据封装成文章对象  并且把这7个文章对象存放到一个集合中
            /**
             * 第一个参数 客户端的读流
             * 第二个参数 我们需要把excel中每一行封装成什么对象  你就写Article类
             *
             * sheet(0)  读取第一个工作表的数据
             * .doReadSync()  异步读取
             */
            List<Article> list= EasyExcel.read(inputStream)
                    .registerReadListener(ul).
                    head(Article.class)
                    .sheet(0).doReadSync();
            if(list.size()>0){
                System.out.println(list);
            }

            return new Result(Code.IMPORT_OK,"导入成功");

        } catch (IOException e) {
            e.printStackTrace();
            return new Result(Code.IMPORT_ERR,"导入失败");
        }
    }

    @PostMapping(value = "export/{id}")
    public ResponseEntity<byte[]> export(HttpServletResponse response, @PathVariable Integer id) {
        try {
            // 查询数据
            //根据这个人的id查询出他发表的所有文章
            List<Article> arts = articleService.findByUserId02(id);
            // 使用 try-with-resources 管理 ByteArrayOutputStream 资源
            //Byte 字节 Array 数组 OutputStream 写流
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream() ;
            // 使用 EasyExcel 写入数据到输出流
            //sheet 代表第几个工作表
            EasyExcel.write(outputStream, Article.class).sheet("文章信息").doWrite(arts);
            // 返回响应实体
            //你要告诉浏览器响应的是一个excel文件
            HttpHeaders headers = new HttpHeaders();
            //HttpHeaders.CONTENT_DISPOSITION  响应的格式
            // attachment; 带附件  filename=people.xlsx  表示下载的文件名是people.xlsx
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=people.xlsx");
            // 返回响应实体
            return ResponseEntity
                    .ok()
                    .headers(headers)
                    .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
                    .body(outputStream.toByteArray());

        } catch (Exception e) {
            e.printStackTrace();
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    @GetMapping("/chabyid/{id}")
    @ApiModelProperty(value = "根据文章分类id查询文章")
    public Result findfenleiById(@PathVariable Integer id) {
        List<Article> byCategoryId = articleService.chabyid(id);
        if(byCategoryId!=null){
            return new Result(Code.GET_OK,byCategoryId,"查询成功");
        }else {
            return new Result(Code.GET_ERR,"查询失败");
        }
    }
}
